#include "stm32f10x.h"                  // Device header
//#include "stm32f10x_exti.h"
#include "sys.h"
#include "ec11.h"
int16_t Encoder_Count;//定义一个带符号的变量

int8_t AA=0;//定义一个带符号的变量

void Encoder_Init(void)
{
    //配置RCC
    GPIO_InitTypeDef GPIO_InitStructure;//定义GPIO结构体变量
		EXTI_InitTypeDef EXTI_InitStructure;//定义外部中断结构体变量
		NVIC_InitTypeDef NVIC_InitStructure;//定义中断优先级结构体变量

		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
    //配置GPIO
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;//使用到PA6和PA7口
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);
    
    //配置AFIO
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource6);
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource7); //AFIO每个中断是分开的
    //配置EXTI
    EXTI_InitStructure.EXTI_Line=EXTI_Line6;//使用到中断6
    EXTI_InitStructure.EXTI_LineCmd=ENABLE;//中断使能
    EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;//中断模式
    EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising_Falling; //上升下降沿触发
    EXTI_Init(&EXTI_InitStructure);
    
    //配置NVIC，这里配置了个中断
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//调用一次即可，只能有一个，有多个必须保证相同

    NVIC_InitStructure.NVIC_IRQChannel=EXTI9_5_IRQn;//中断6的配置
    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级为1
    NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;//响应优先级为1
    NVIC_Init(&NVIC_InitStructure);//NVIC初始化
}

int16_t Return_Encoder_Count(void) //返回Encoder_Count的值，如果正转就返回+1，反转就返回-1。方便共主函数操作
{
    int16_t Temp;
    Temp = Encoder_Count;              
    Encoder_Count=0;
    return Temp;
}


void EXTI9_5_IRQHandler(void)
{
    if(EXTI_GetFlagStatus(EXTI_Line6)==SET)
    {
				EXTI_ClearITPendingBit(EXTI_Line6);//清除中断标志位，以便下一次进入中断
				delay_us(1);
        if((GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7)==0&&GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6)==1)\
					||(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7)==1&&GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6)==1)) //如果正转
        {
           AA = 1;
					delay_us(200);
        }
        else if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7)==1&&GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6)==0&&AA==1)  //如果正转
        {
          Encoder_Count++;  
					AA = 0;
        }				
//        if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7)==1&&GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6)==1)  //如果正转
//        {
//           AA = 1;
//        }
        else if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7)==0&&GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6)==0&&AA==1)  //如果正转
        {
          Encoder_Count--;  
					AA = 0;
        }	
    }

  
}






